package model.scaling;

import java.util.ArrayList;
import java.util.List;

import model.IManufacturingMethod;
import model.auxillary.Parameter;
import model.auxillary.ParameterCollectionScaling;
import model.auxillary.ParameterListScaling;
import model.auxillary.ParameterListScaling.ParameterType;

//#Neu
/**
 * Interface for the {@code Facility} class.
 * @author Sebastian Perlwitz
 *
 */
public interface IFacility extends ICalculatableScaling {
	
	/**
 	 * To add a {@code ManufacturingMethod} to this {@code Facility}.
 	 * @param manuMethod the manuMethod to be added.
 	 */
 	public void addManuMethod(IManufacturingMethod manuMethod);
 	
 	/**
 	 * To remove all assigned manufacturing methods from this {@code Facility}.
 	 */
 	public void removeAllManuMethodsOfFacility();
 	
 	/**
 	 * To get all manufacturing methods that have been assigned to this 
 	 * facility.
 	 * @return The manufacturing methods.
 	 */
 	public ArrayList<IManufacturingMethod> getManuMethods();
 	
 	/**
	 * To get all parameters of this {@code Facility}.
	 * @return The parameters.
	 */
	public ParameterListScaling getParameters();
 	
 	/**
	 * To get a parameter by it's unique ID.	 
	 * @param parameterID the parameter's ID.
	 * @return The parameter.
	 */
	public Parameter getParameter(String parameterID);
 	
 	/**
	 * To get a parameter by its abbreviation and type.
	 * @param abbreviation the abbreviation of the parameter.
	 * @param type the type of the parameter.
	 * @return The parameter.
	 */
	public Parameter getParameter(String abbreviation, ParameterType type);
	
	/**
     * To get all parameters of same type.
     * @param type the parameters' type.
     * @return The parameters.
     */
    public List<ParameterCollectionScaling> getParameters(ParameterType type);
	
	/**
     * To set an identifying name for this {@code Facility}.
     * @param name the new name that is to be set.
     */
    public void setName(String name);
    
    /**
     * To get the identifying name of this {@code Facility}.
     * @return The name of this {@code Facility}.
     */
    public String getName();
    
    /**
	 * To get the unique ID of this {@code Facility}.
	 * @return The unique ID.
	 */
    public String getID();

}
